/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package pos.gui;

import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.dom.client.ClickEvent;
import com.google.gwt.event.dom.client.ClickHandler;
import com.google.gwt.i18n.shared.DateTimeFormat;
import com.google.gwt.i18n.shared.DateTimeFormat;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.*;
import com.google.gwt.user.datepicker.client.DatePicker;
import java.sql.Timestamp;
import java.text.ParseException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.List;
import java.util.logging.Level;
import java.util.logging.Logger;
import pos.controller.OperazioneFinanziariaController;
import pos.domain.*;
import pos.server.dac.exceptions.EccezioneCRUD;

public class OperazioneFinanziariaView extends HorizontalPanel {
    
    // i main panel
    
    private VerticalPanel rightPanel = new VerticalPanel();
    
    // subPanel left panel
    private FlexTable groupInputPanel = new FlexTable(); 

    private HorizontalPanel radioPanel = new HorizontalPanel();
    private FlexTable radioTablePanel = new FlexTable();
    
    // Controlli left panel
    
    private TextBox nomeBox = new TextBox();
    private TextBox categoriaBox = new TextBox();
    private DoubleBox sommaBox = new DoubleBox();
    private DatePicker dataBox = new DatePicker();
    private Button aggButton = new Button("Aggiungi");
   
    //controlli right panel
    private static FlexTable operazioniTable = new FlexTable();
    private static RadioButton uscite = new RadioButton("StaticGroup", "uscite");
    private static RadioButton entrate = new RadioButton("StaticGroup", "entrate");
    private static RadioButton usciteEntrate = new RadioButton("StaticGroup", "usciteEntrate");

   private static List<OperazioneFinanziaria> model = new ArrayList<OperazioneFinanziaria>(); 
        
        public OperazioneFinanziariaView() {
        setSpacing(100);
        
        //panel di sinistra
        groupInputPanel.setWidget(0, 0, new Label("Nome:"));
        groupInputPanel.setWidget(0, 1, nomeBox);
        groupInputPanel.setWidget(1, 0, new Label("Categoria:"));
        groupInputPanel.setWidget(1, 1, categoriaBox);
        groupInputPanel.setWidget(2, 0, new Label("Somma:"));
        groupInputPanel.setWidget(2, 1, sommaBox);       
        groupInputPanel.setWidget(3, 0, new Label("Data:"));
        groupInputPanel.setWidget(3, 1, dataBox);   
        groupInputPanel.setWidget(4, 1, aggButton); 
        
        add(groupInputPanel);
        
        //panel di destra
        radioPanel.add(uscite);
        radioPanel.add(entrate);
        radioPanel.add(usciteEntrate);
        rightPanel.add(new Label("Statistica"));
        rightPanel.add(radioPanel);
        rightPanel.add(operazioniTable);
        
        add(rightPanel);
    
        // Gestione dei eventi
        entrate.addClickHandler(new OFHandler("+"));
        uscite.addClickHandler(new OFHandler("-"));
        usciteEntrate.addClickHandler(new OFHandler("."));

        aggiungiHandler(aggButton);
        
        // Aggiornamento del modello con operazioni dal BD
        
    }
        
    static String type;

        private void aggiungiHandler(Button aggButton) {
            
        aggButton.addClickHandler(new ClickHandler() {

            @Override
            public void onClick(ClickEvent event) {
            System.out.println("\n Sto in AggiungiHandler");
                try {
                    
                    OperazioneFinanziaria of = new OperazioneFinanziaria(nomeBox.getText(), categoriaBox.getText(), sommaBox.getValueOrThrow(), dataBox.getValue().getTime());
                    TipoLinkU_FO link = new TipoLinkU_FO(Index.getUtente(), of);
                      
                    of.inserisciLinkFU(link);
                    // Window.alert(link.getUtente_login()+" "+link.getOperazioneFinanziaria());
                     System.out.println("\n Sto in try AggiungiHandler");
                     //
                   OperazioneFinanziariaController.aggiornaModello(); 
                    try {
                        OperazioneFinanziariaController.aggiungi(of);
                    } catch (EccezioneCRUD ex) {
                        Logger.getLogger(OperazioneFinanziariaView.class.getName()).log(Level.SEVERE, null, ex);
                    } catch (EccezioneCardMinMax ex) {
                        Logger.getLogger(OperazioneFinanziariaView.class.getName()).log(Level.SEVERE, null, ex);
                    }
                   clearFields();
/*
                } catch (EccezioneCRUD ex) {
                    Logger.getLogger(OperazioneFinanziariaView.class.getName()).log(Level.SEVERE, null, ex);
                } catch (EccezioneCardMinMax ex) {
                    Logger.getLogger(OperazioneFinanziariaView.class.getName()).log(Level.SEVERE, null, ex);
                */} catch (EccezionePrecondizioni ex) {
                    Logger.getLogger(OperazioneFinanziariaView.class.getName()).log(Level.SEVERE, null, ex);
                } catch (ParseException ex) {
                    Window.alert("La somma sbagliata");
                }
            }
            
        });
    }
    
    
    private static void showEntrate(int column) {
        column *= 2;
        int row = 2;
        double somma=0;
        operazioniTable.setText(0, column, "Entrate");
        operazioniTable.setText(1, column, "Nome");
        operazioniTable.setText(1, column+1, "Categoria");
        operazioniTable.setText(1, column+2, "Somma");
        operazioniTable.setText(1, column+3, "Data");
        
        for (int i = 0; i < model.size(); i++) {
            OperazioneFinanziaria o = model.get(i);
            if (o.getSomma() > 0) {
               Date data=new Date(o.getData());
               String data_str=DateTimeFormat.getFormat("dd/MM/yyyy").format(data);
               somma=somma+o.getSomma();
               
               operazioniTable.setText(row, column, o.getNome());
               operazioniTable.setText(row, column+1, o.getCategoria());
               operazioniTable.setText(row, column+2,Double.toString(o.getSomma()));
               operazioniTable.setText(row, column+3, data_str);
                
                Button eliminami = new Button("x");
                eliminami.addClickHandler(new EliminaClickHandler(i,model.get(i)));
                operazioniTable.setWidget(row, column + 4, eliminami);
                row++;
            }
        }
           operazioniTable.setText(row, column, "Somma");
           operazioniTable.setText(row, column+1,Double.toString(somma));
    }
    
    private static void showUscite(int column) {
        column *= 2;
        int row = 2;
        double somma=0;
        
        operazioniTable.setText(0, column, "Uscite");
        operazioniTable.setText(0, column, "Nome");
        operazioniTable.setText(0, column+1, "Categoria");
        operazioniTable.setText(0, column+2, "Somma");
        operazioniTable.setText(0, column+3, "Data");
        
        for (int i = 0; i < model.size(); i++) {
            OperazioneFinanziaria o = model.get(i);
            if (o.getSomma() < 0) {
                somma=somma+o.getSomma();
                Date data=new Date(o.getData());
               String data_str=DateTimeFormat.getFormat("dd/MM/yyyy").format(data);
               
               operazioniTable.setText(row, column, o.getNome());
               operazioniTable.setText(row, column+1, o.getCategoria());
               operazioniTable.setText(row, column+2,Double.toString(Math.abs(o.getSomma())));
               operazioniTable.setText(row, column+3, data_str);
               
                Button eliminami = new Button("x");
                eliminami.addClickHandler(new EliminaClickHandler(i,model.get(i)));
                operazioniTable.setWidget(row, column + 4, eliminami);
                row++;
            }
        }
        operazioniTable.setText(row, column, "Somma");
        operazioniTable.setText(row, column+1, Double.toString(Math.abs(somma)));
    }

   
    private static class OFHandler implements ClickHandler {

        String type;

        public OFHandler(String string) {
            type = string;
        }

        @Override
        public void onClick(ClickEvent event) {
            OperazioneFinanziariaView.type = type;
            OperazioneFinanziariaController.aggiornaModello();
        }
    }
   



     static class EliminaClickHandler implements ClickHandler {

        int row;
        OperazioneFinanziaria of;
        public EliminaClickHandler(int row,OperazioneFinanziaria o) {
            this.row = row;
            this.of=o;
        }

        @Override
        public void onClick(ClickEvent event) {
            model.remove(row);
            try {
                OperazioneFinanziariaController.elimina(of);
            } catch (EccezioneCRUD ex) {
                Logger.getLogger(OperazioneFinanziariaView.class.getName()).log(Level.SEVERE, null, ex);
            } catch (EccezioneCardMinMax ex) {
                Logger.getLogger(OperazioneFinanziariaView.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

    public static void refresh() {
            
        operazioniTable.removeAllRows();
        
        if (type.equals("+")) {
            showEntrate(0);
        } else if (type.equals("-")) {
            showUscite(0);
        } else {
            showEntrate(0);
            showUscite(4);
        }
    }

    public static void setModel(Collection<OperazioneFinanziaria> mo) {
        //model.toString();
        model.clear();
        model.addAll(mo);
        //model.add(o);
        refresh();
    }
    
    private void clearFields(){
    nomeBox.setText("");
    categoriaBox.setText("");
    sommaBox.setText("");
    }
    
    public static void addToModel(OperazioneFinanziaria of){
        model.add(of);
    }
}
